package main

import (
	"fmt"
	"runtime"
	"sync"
	"time"
)

var pool = sync.Pool{
	New: func() interface{} {
		return 0
	},
}

func main() {
	runtime.GOMAXPROCS(1)
	t1 := pool.Get()
	fmt.Println(t1) // 0

	pool.Put(1)
	pool.Put(2)
	pool.Put(3)
	pool.Put(4)
	t2 := pool.Get()
	fmt.Println(t2) // 1

	runtime.GC() //手动触发GC
	pool.Put(5)
	time.Sleep(1 * time.Second)

	t3 := pool.Get()
	fmt.Println(t3) // 5

	t4 := pool.Get()
	fmt.Println(t4) // 2

}

// 这里测试只有一个P的情况下的读取，方便理解
// 获取t1时，因为私有对象和共享池都没有，所以会从New()中获取，因此得到0；
// 获取t2时，此时私有对象的值为1，共享池里的值为[2, 3, 4]，因此得到1；
// 触发一次GC操作，此时local中的数据全部挪到victim中；
// Put(5)，会把5写入到poolLocal的私有对象里；
// 获取t3时，先从私有对象里获取，这里取到了5；
// 获取t4时，poolLocal的私有对象和共享池都没有数据，而且只有一个P，因此会从victim中获取，这里取到了2
